// 导入路由实例，用于在需要时进行页面跳转
import router from '@/router';
// 导入axios库，用于发起HTTP请求
import axios from 'axios'
import {Message} from 'element-ui'

let createTime =new Date().getTime()
setInterval(()=>{
    createTime = new Date().getTime()
},5000)
// 创建一个新的axios对象，配置基本的请求参数
const request = axios.create({
    baseURL: 'http://localhost:7001',   // 设置请求的基础URL，即后端接口地址
    timeout: 30*1000                        // 设置请求超时时间为30秒
})

request.defaults.timeout = 30 * 1000,
// request 拦截器
// 这个拦截器可以在请求发送前对请求进行处理
request.interceptors.request.use(config => {
    // 从localStorage中获取用户token，如果不存在则默认为空对象
    let user = JSON.parse(localStorage.getItem("property") || '{}');
    // 将token添加到请求头中，以便后端进行验证
    if(!config.url.includes('login') && !config.url.includes('register')
        && !config.url.includes('forget') && !config.url.includes('getRandom')){
        config.headers['token'] = user.token;
    }

    // 返回处理后的config对象，以便继续请求
    return config;
});

// response 拦截器
// 这个拦截器可以在接口响应后对结果进行统一处理
request.interceptors.response.use(
    response => {
        // 获取响应头中的 Content-Type
        const contentType = response.headers['content-type'];

        // 如果是 HTML 响应（支付宝支付等），直接返回，不解析 JSON
        if (contentType && contentType.includes('text/html')) {
            return response.data; // 直接返回 HTML 字符串
        }
        
        // 获取响应数据
        let res = response.data;
        // 兼容处理服务端返回的字符串数据，将其解析为JSON对象
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res;
        }

        // 根据状态码进行处理
        switch (res.code) {
            case 401: // 未授权
                router.push('/login');
                return {
                    type: 'error',
                    message: '用户未授权，请重新登录'
                };
            case 201: // 服务器错误
                return {
                    type: 'error',
                    message: res.message
                };
            case 403: // 拒绝访问
                alert('服务器拒绝访问,请重新登录')
                router.push('/login');
                return {
                    type: 'error',
                    message: '服务器拒绝访问'
                };
            case 404: // 未找到
                alert('网络请求地址不存在，请检查后重试')
                return {
                    type: 'error',
                    message: '网络请求地址不存在，请检查后重试'
                };
            default:
                response.type = 'success'
                return response; // 如果没有错误，则返回正常响应数据
        }

    },
    error => {
        messageCode(error.status);
        // 返回自定义错误对象，而不是抛出异常
        return {
            type: 'error',
            message: error.message
        };
    }
);

function messageCode(code){
    switch (code) {
        case 401: // 未授权
            alert('用户未授权，请重新登录')
            router.push('/login');
            return {
                type: 'error',
                message: '用户未授权，请重新登录'
            };
        case 201: // 服务器错误
            return {
                type: 'error',
                message: '服务器错误，请稍后再试'
            };
        case 403: // 拒绝访问
            alert('服务器拒绝访问,请重新登录')
            router.push('/login');
            return {
                type: 'error',
                message: '服务器拒绝访问'
            };
        case 404: // 未找到
            alert('网络请求地址不存在，请检查后重试')
            return {
                type: 'error',
                message: '网络请求地址不存在，请检查后重试'
            };
        default:
            return {
                type: 'success',
            };
    }
}

// 导出配置好的axios实例，以便在其他模块中使用
export default request;
